package com.example.utils;

import java.util.*;

/**
 * @author ChenXiaoBin
 * on 2019-07-09
 */
public class ListUtil {

    /**
     * 比较一个list集合里是否有重复
     * */
    public static boolean isRepeat(List<Object> list) {
        Set<Object> set = new HashSet<>(list);
        return set.size() != list.size();
    }

    /**
     * 比较两个集合是否有重复
     * */
    public static boolean isRepeat(List<Object> list1, List<Object> list2){
        Set<Object> set1 = new HashSet<>(list1);
        Set<Object> set2 = new HashSet<>(list2);
        Set<Object> setAll = new HashSet<>(set1);
        setAll.addAll(set2);
        int setSize = set1.size() + set2.size();
        return setAll.size() != setSize;
    }

    /**
     * 单个List集合去除重复
     * */
    public static List<Object> removeRepeat(List<Object> list) {
        Set<Object> set = new HashSet<>(list);
        return new ArrayList<>(set);
    }

    /**
     * 比较两个集合是否有重复(有相同移除第一个集合中的相同值)
     * */
     //一般法
    public static List<Object> removeRepeat(List<Object> list1, List<Object> list2) {
        List<Object> newList = new ArrayList<Object>();
        for (Object o1 : list1) {
            boolean flag = true;
            for (Object o2 : list2) {
                if (o1.equals(o2)){
                    flag = false;
                    break;
                }
            }
            if (flag){
                newList.add(o1);
            }
        }
        return newList;
    }
    //方法二：
    public static List<Integer> removeRepeat2(List<Integer> list1, List<Integer> list2) {
        list1.removeAll(list2);
        return list1;
    }


    /**
     * 求两个集合的交集（即两个集合都共有的）
     * */
//最优法   利用hash这种很有用的数据结构来实现。我们知道，hash的特点之一就是不允许有重复元素，即hash表中的元素都是唯一的。所以，我们的思路就是：先把第一个集合的所有元素都放进hashSet中，时间复杂度O(M)；再把第二个集合中的元素放进hashSet中，如果有重复元素，就是这2个集合的交集，时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。
    public static List<String> getIntersection(List<String> list1, List<String> list2) {
        List<String> commonList = new ArrayList<>();
        Set<Object> hashSet = new HashSet<>();
        Collections.addAll(hashSet,list1);

        for (String item : list2) {
            if (!hashSet.add(item)) {
                commonList.add(item);
            }
        }
        return commonList;
    }

    /**
     * 求两个集合的并集(即两个集合中重复的只保留一个)
     * */
    public static List<Object> unionAll(List<Object> list1, List<Object> list2) {
        list1.removeAll(list2);
        list1.addAll(list2);
        return list1;
    }

}
